package com.sprouting.personal.task;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.io.FileUtil;
import com.sprouting.personal.dao.ConfigDao;
import com.sprouting.personal.model.entity.UploadFile;
import com.sprouting.personal.service.UploadFileService;
import com.sprouting.personal.utils.CheckTool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 清理脏数据- 对上传的文件进行处理
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/12/19 11:18
 */
@Component
@Slf4j
public class ClearFileTask {

    @Autowired
    private UploadFileService uploadFileService;
    @Resource
    private ConfigDao configDao;

    /**
     * 文件存储基础路径
     */
    @Value("${upload.data.base.path}")
    private String basePath;


    /**
     * 入口-开始位置，UploadFile 脏数据文件处理
     * fixedRate 是多久执行一次，单位是毫秒
     */
    @Scheduled(fixedRate = 3600000)
    public void start(){
        TimeInterval timer = DateUtil.timer();
        log.info("[UploadFile处理] 开始进行清理");

        // 1、读取出文件，已经超过了48小时的，不做配置，因为意义不大，反而容易让人改掉
        DateTime dateTime = DateUtil.offsetHour(new Date(), -48);
        log.info("[UploadFile处理] 开始检测创建时间在 {} 之前的临时文件", DateUtil.formatDateTime(dateTime));
        Integer exists = configDao.getWhetherTableExists("ps_upload_file");
        if (exists < 1){
            log.info("[UploadFile处理] 当前表还未构建成功，初始化中，停止任务");
            return;
        }
        List<UploadFile> uploadFileList = uploadFileService.getUploadFileTempTimedOut(dateTime);

        // 2、检查文件是否存在，存在就进行删除
        if (CollUtil.isNotEmpty(uploadFileList)){
            delFileList(uploadFileList);
        }

        // todo 检查记事本目录是否有空文件夹，且超过一定时间的，就进行删除操作

        // 花费毫秒数
        long interval = timer.interval();
        // 花费分钟数
        long timeLong = timer.intervalMinute();
        log.info("[UploadFile处理] 结束清理,花费 {} 分钟（共计：{} 毫秒）", timeLong, interval);

    }

    /**
     * 删除数据
     * @param uploadFileList 要删除的列表
     */
    private void delFileList(List<UploadFile> uploadFileList){
        for (UploadFile uploadFile : uploadFileList){
            log.info("[UploadFile处理] 开始删除数据 {}", uploadFile.getId());

            String savePath = uploadFile.getSavePath();
            if (!CheckTool.checkNull(savePath)){
                if (!FileUtil.exist(basePath + savePath)){
                    log.warn("[UploadFile处理] 未找到文件,ID :{}, 路径：{}", uploadFile.getId(), uploadFile.getSavePath());
                    uploadFile.setFileInfo("文件不存在");
                    uploadFileService.updateById(uploadFile);
                    continue;
                }
                // 做容错措施，如果是目录，不进行操作，数据非常重要，一定要多检查
                if (FileUtil.isFile(basePath + savePath)){
                    FileUtil.del(basePath + savePath);
                    log.warn("[UploadFile处理] 删除文件成功,ID :{}, 路径：{}", uploadFile.getId(), uploadFile.getSavePath());
                    uploadFileService.removeById(uploadFile.getId());

                } else {
                    log.error("[UploadFile处理] 要删除的是数据是目录，跳过该删除操作：{}", basePath + basePath);
                    uploadFile.setFileInfo("文件夹，无法进行删除");
                    uploadFileService.updateById(uploadFile);
                }
            }
        }
    }

}
